package cn.mujiankeji.mbrowser.界面.框架.主视图

import android.content.Context
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Star
import androidx.compose.material3.BottomSheetDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.界面.图标.MyIconPack
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.下载
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.书签
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.历史
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.暗色
import kotlinx.coroutines.launch
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.asPaddingValues
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.app.应用路由
import cn.mujiankeji.mbrowser.工具.安卓接口
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.书本
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.代码
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.代码块
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.全屏
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.分享
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.刷新
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.拦截
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.提示
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.搜索
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.无图
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.无痕模式
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.日记
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.本地页面
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.模块
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.比较
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.注销
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.电脑
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.网站配置
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.翻译
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.设置
import cn.mujiankeji.mbrowser.界面.标签页.网页.网页标签状态
import cn.mujiankeji.mbrowser.app.界面模块
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框状态
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.数据.枚举类.主题颜色枚举
import cn.mujiankeji.mbrowser.数据.枚举类.应用页面枚举
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.太阳
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.月亮
import cn.mujiankeji.mbrowser.界面.图标.myiconpack.自适应主题
import cn.mujiankeji.mbrowser.界面.小窗页.管理.网站设置窗口状态
import cn.mujiankeji.mbrowser.界面.标签页.快照.快照状态_阅读
import cn.mujiankeji.mbrowser.界面.标签页.阅读页面.阅读页面状态
import cn.mujiankeji.mbrowser.界面.标签页.页面管理.页面管理标签状态
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.koin.compose.koinInject
import org.koin.core.context.GlobalContext

/**
 * 菜单项数据类
 */
data class 菜单项(
    val 图标: ImageVector,
    val 标题: String,
    val 点击回调: () -> Unit,
    val 启用: Boolean = true,
    val 选中: Boolean = false
)

/**
 * 菜单栏实现 - 底部窗口，使用五列三行多页面水平Pager的设计
 */
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
fun 菜单栏(
    显示: Boolean,
    onDismissRequest: () -> Unit
) {
    val viewModel: 界面模块 = koinInject()
    val 当前标签页 = viewModel.当前标签页
    val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
    val scope = rememberCoroutineScope()
    val 当前属于网页 = 当前标签页 is 网页标签状态

    fun 取网页() : 网页标签状态? = 当前标签页?.let { if (it is 网页标签状态) it else null }

    // 第一页菜单项
    val 第一页菜单项 = buildList {

        // 1-1
        add(菜单项(
            图标 = MyIconPack.无痕模式,
            标题 = "无痕",
            选中 = runBlocking { 应用配置.读取无痕模式().first() },
            点击回调 = {
                runBlocking {
                    应用配置.设置无痕模式(!应用配置.读取无痕模式().first())
                    onDismissRequest()
                }
            }
        ))

        // 1-2
        add(菜单项(图标 = runBlocking {
            when(应用配置.读取主题颜色().first()){
                主题颜色枚举.浅色 -> MyIconPack.太阳
                主题颜色枚举.深色 -> MyIconPack.月亮
                else -> MyIconPack.自适应主题
            }
        }
            , 标题 = runBlocking {
                when(应用配置.读取主题颜色().first()){
                    主题颜色枚举.浅色 -> "浅色"
                    主题颜色枚举.深色 -> "深色"
                    else -> "自动"
                }

            },
            选中 = runBlocking {
                应用配置.读取主题颜色().first() != 主题颜色枚举.跟随系统
            }, 点击回调 = {
                runBlocking {
                    when(应用配置.读取主题颜色().first()) {
                        主题颜色枚举.深色 -> 应用配置.设置主题颜色(主题颜色枚举.浅色)
                        主题颜色枚举.浅色 -> 应用配置.设置主题颜色(主题颜色枚举.跟随系统)
                        主题颜色枚举.跟随系统 -> 应用配置.设置主题颜色(主题颜色枚举.深色)
                    }
                    onDismissRequest()
                }

        }))

        // 1-3
        add(菜单项(图标 = MyIconPack.书本, 标题 = "阅读",
            启用 = 当前属于网页,
            选中 = false, 点击回调 = {
                (当前标签页 as 网页标签状态).跳转到阅读模式()
                onDismissRequest()
            }))


        // 1-4
        add(菜单项(图标 = MyIconPack.翻译, 标题 = "翻译",
            启用 = 当前属于网页 || 当前标签页 is 阅读页面状态 || 当前标签页 is 快照状态_阅读,
            选中 = 取网页()?.浏览框状态?.页面配置?.启用自动翻译 == true,
            点击回调 = {
                if (当前属于网页){
                    (当前标签页 as 网页标签状态).切换翻译状态()
                }
                else if (当前标签页 is 阅读页面状态){
                    (当前标签页 as 阅读页面状态).翻译()
                }
                else if (当前标签页 is 快照状态_阅读){
                    当前标签页.翻译()
                }
                onDismissRequest()
            }))

        // 1-5
        add(菜单项(图标 = MyIconPack.刷新, 标题 = "刷新",
            点击回调 = {
                viewModel.刷新()
                onDismissRequest()
            }))

        // 2-1
        add(菜单项(图标 = Icons.Default.Star, 标题 = "收藏",
            启用 = 当前标签页?.可否添加收藏 == true,
            选中 = false, 点击回调 = {
                当前标签页?.添加收藏()
                onDismissRequest()
            }))

        // 2-2
        add(菜单项(图标 = MyIconPack.书签, 标题 = "书签",
            点击回调 = {
                // 创建书签标签页
                应用路由.加载(应用页面枚举.书签管理)
                onDismissRequest()
            }))

        // 2-3
        add(菜单项(图标 = MyIconPack.历史, 标题 = "历史",
            点击回调 = {
                // 创建历史标签页
                应用路由.加载(应用页面枚举.历史记录管理)
                onDismissRequest()
            }))

        // 2-4
        add(菜单项(图标 = MyIconPack.本地页面, 标题 = "页面",
            点击回调 = {
                应用路由.加载(页面管理标签状态())
                onDismissRequest()
            }))

        // 2-5
        add(菜单项(图标 = MyIconPack.下载, 标题 = "下载",
            点击回调 = {
                应用路由.加载(应用页面枚举.下载管理)
                onDismissRequest()
            }))

        // 3-1
        add(菜单项(图标 = MyIconPack.代码块, 标题 = "元素",
            启用 = 当前属于网页,
            点击回调 = {
                (当前标签页 as 网页标签状态).切换开发者模式()
                onDismissRequest()
            }))

        // 3-2
        add(菜单项(图标 = MyIconPack.电脑, 标题 = "电脑版",
            启用 = 当前属于网页,
            选中 = runBlocking { 应用配置.读取强制启动电脑模式().first() },
            点击回调 = {
                runBlocking {
                    val new = 应用配置.读取强制启动电脑模式().first()
                    应用配置.设置强制启动电脑模式(new)
                    (当前标签页 as 网页标签状态).设置电脑模式(new)
                }
                onDismissRequest()
            }))

        // 3-3
        add(菜单项(图标 = MyIconPack.分享, 标题 = "分享",
            启用 = 当前属于网页,
            点击回调 = {
                val url = if (当前标签页 is 网页标签状态) {
                    当前标签页.地址.value
                } else null
                安卓接口.分享(GlobalContext.get().get<Context>(),"", url)
                onDismissRequest()
            }))

        // 3-4
        add(菜单项(图标 = MyIconPack.注销, 标题 = "退出",
            点击回调 = {
                应用接口.注销()
                onDismissRequest()
            }))

        // 3-5
        add(菜单项(图标 = MyIconPack.设置, 标题 = "设置",
            点击回调 = {
                应用路由.加载(应用页面枚举.设置)
                onDismissRequest()
            }))

    }

    // 第二页菜单项
    val 第二页菜单项 = buildList {

        // 1-1
        add(菜单项(图标 = MyIconPack.拦截, 标题 = "广告",
            选中 = 应用配置.广告拦截,
            点击回调 = {
                应用路由.加载(应用页面枚举.广告拦截管理)
                onDismissRequest()
            }))

        // 1-2
        add(菜单项(图标 = MyIconPack.模块, 标题 = "脚本",
            点击回调 = {
                应用路由.加载(应用页面枚举.用户脚本管理)
                onDismissRequest()
            }))

        // 1-3
        add(菜单项(图标 = MyIconPack.全屏, 标题 = "全屏",
            选中 = runBlocking {  应用配置.是否全屏模式().first() },
            点击回调 = {
                val k = runBlocking {  应用配置.是否全屏模式().first() }
                应用配置.设置全屏模式(!k)
                onDismissRequest()
            }))

        // 1-4
        add(菜单项(图标 = MyIconPack.无图, 标题 = "无图",
            点击回调 = {
                // TODO 跳转脚本设置窗口
            }))

        // 1-5
        add(菜单项(图标 = MyIconPack.比较, 标题 = "UA标识",
            点击回调 = {
                // TODO 跳转脚本设置窗口
            }))

        // 2-1
        add(菜单项(图标 = MyIconPack.网站配置, 标题 = "网站",
            启用 = 当前属于网页,
            点击回调 = {
                val hosturl = 地址操作.取完整主机名(取网页()?.地址?.value?:"")
                网站设置窗口状态(hosturl){
                    取网页()?.重载(it)
                }.显示()
                onDismissRequest()
            }))

        // 2-2
        add(菜单项(图标 = MyIconPack.日记, 标题 = "日记",
            启用 = 当前属于网页,
            点击回调 = {
                取网页()?.查看日记()
                onDismissRequest()
            }))

        // 2-3
        add(菜单项(图标 = MyIconPack.代码, 标题 = "源码",
            启用 = 当前属于网页,
            点击回调 = {
                取网页()?.查看源码()
                onDismissRequest()
            }))

        // 2-4
        add(菜单项(图标 = MyIconPack.搜索, 标题 = "查找",
            启用 = 当前属于网页,
            点击回调 = {
                取网页()?.切换页面查找状态()
                onDismissRequest()
            }))


        // 2-5
        add(菜单项(图标 = MyIconPack.本地页面, 标题 = "保存页面",
            启用 = 当前属于网页,
            点击回调 = {
                取网页()?.保存页面()
                onDismissRequest()
            }))


        // 3-1
        add(菜单项(图标 = MyIconPack.提示, 标题 = "关于",
            点击回调 = {
                应用路由.加载(应用页面枚举.关于页面)
                onDismissRequest()
            }))


    }
    
    // 组合所有页面的菜单项
    val 所有页面菜单项 = listOf(第一页菜单项, 第二页菜单项)
    
    if (显示) {
        ModalBottomSheet(
            onDismissRequest = onDismissRequest,
            sheetState = sheetState,
            containerColor = MaterialTheme.colorScheme.surface,
            dragHandle = { BottomSheetDefaults.DragHandle() },
            modifier = Modifier.wrapContentHeight()
        ) {
            Column(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(bottom = 16.dp)
                    .padding(WindowInsets.navigationBars.asPaddingValues())
            ) {
                val pagerState = rememberPagerState(pageCount = { 所有页面菜单项.size })
                
                // 水平Pager用于切换菜单页
                HorizontalPager(
                    state = pagerState,
                    modifier = Modifier.fillMaxWidth()
                ) { page ->
                    // 每页显示五列三行的菜单项
                    val pageItems = 所有页面菜单项[page]
                    Column(
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(horizontal = 8.dp)
                    ) {
                        // 分割成3行
                        for (row in 0 until 3) {
                            Row(
                                modifier = Modifier
                                    .fillMaxWidth()
                                    .padding(vertical = 8.dp),
                                horizontalArrangement = Arrangement.SpaceEvenly
                            ) {
                                // 每行显示5个菜单项
                                for (col in 0 until 5) {
                                    val index = row * 5 + col
                                    if (index < pageItems.size) {
                                        val item = pageItems[index]
                                        Column(
                                            horizontalAlignment = Alignment.CenterHorizontally,
                                            modifier = if (item.启用) {
                                                Modifier
                                                    .weight(1f)
                                                    .clickable(onClick = item.点击回调)
                                                    .padding(4.dp)
                                            } else {
                                                Modifier
                                                    .weight(1f)
                                                    .padding(4.dp)
                                            }
                                        ) {
                                            Icon(
                                                imageVector = item.图标,
                                                contentDescription = item.标题,
                                                modifier = Modifier
                                                    .size(28.dp)
                                                    .padding(bottom = 4.dp),
                                                tint = when {
                                                    !item.启用 -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f)
                                                    item.选中 -> MaterialTheme.colorScheme.primary
                                                    else -> MaterialTheme.colorScheme.onSurface
                                                }
                                            )
                                            Text(
                                                text = item.标题,
                                                style = MaterialTheme.typography.bodySmall,
                                                textAlign = TextAlign.Center,
                                                color = when {
                                                    !item.启用 -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f)
                                                    item.选中 -> MaterialTheme.colorScheme.primary
                                                    else -> MaterialTheme.colorScheme.onSurface
                                                }
                                            )
                                        }
                                    } else {
                                        // 占位
                                        Spacer(modifier = Modifier.weight(1f))
                                    }
                                }
                            }
                        }
                    }
                }
                
                // 页面指示器
                Spacer(modifier = Modifier.height(8.dp))
                Row(
                    Modifier
                        .height(16.dp)
                        .fillMaxWidth(),
                    horizontalArrangement = Arrangement.Center
                ) {
                    repeat(所有页面菜单项.size) { iteration ->
                        val color = if (pagerState.currentPage == iteration) 
                            MaterialTheme.colorScheme.primary 
                        else 
                            MaterialTheme.colorScheme.secondary.copy(alpha = 0.5f)
                        Box(
                            modifier = Modifier
                                .padding(2.dp)
                                .clip(CircleShape)
                                .background(color)
                                .size(8.dp)
                                .clickable {
                                    scope.launch {
                                        pagerState.animateScrollToPage(iteration)
                                    }
                                }
                        )
                    }
                }
            }
        }
    }
}

